00001 /////////////////////////////////////////////////////////////////////////////// 00002 /// @file deRender.hpp 00003 /// 00004 /// @brief High-level Rendering interface 00005 /// 00006 /// @author Assassin 00007 /// 00008 /// This file is the intellectual property of Novus Delta, LLC.. Usage of the 00009 /// contents of this file is subject to the Destiny3D Member License which 00010 /// can be found at http://www.destiny3d.com. Any other usage is prohibited. 00011 /// 00012 /// This file is distributed "AS IS" without warranty of any kind. Novus 00013 /// Delta, LLC. does not guarantee the fitness of the contents of this file 00014 /// for any particular purpose. 00015 /// 00016 /// Copyright (C) 2001-2003 Novus Delta, LLC. All Rights Reserved. 00017 /// 00018 /// <hr> 00019 /// Change History 00020 /// <hr> 00021 /// 00022 /// @date Feb 2002 00023 /// @author Assassin 00024 /// @remarks Initial Creation 00025 /// 00026 /////////////////////////////////////////////////////////////////////////////// 00027 00028 #ifndef DERENDER_HPP 00029 #define DERENDER_HPP 00030 00031 #include "deGlobalTypes.hpp" 00032 #include "deDriver.hpp" 00033 #include "deMath.hpp" 00034 00035 #if defined(DERENDER_DLL_EXPORTS) || defined(DESTINY3D_EXPORT_ALL) 00036 # define DERENDER_API extern "C" DEDLL_EXPORT 00037 #elif defined(DESTINY3D_STATIC_LINK) 00038 # define DERENDER_API extern "C" 00039 #else 00040 # define DERENDER_API extern "C" DEDLL_IMPORT 00041 #endif 00042 00043 #ifdef USING_DESTINY3D 00044 #ifdef _DEBUG 00045 # ifdef DESTINY3D_STATIC_LINK 00046 # pragma comment(lib, "deRender_sd") 00047 # else 00048 # pragma comment(lib, "deRenderd") 00049 # endif //DESTINY3D_STATIC_LINK 00050 #else 00051 # ifdef DESTINY3D_STATIC_LINK 00052 # pragma comment(lib, "deRender_s") 00053 # else 00054 # pragma comment(lib, "deRender") 00055 # endif //DESTINY3D_STATIC_LINK 00056 #endif //_DEBUG 00057 #endif //USING_DESTINY3D 00058 00059 00060 class IdePortal; 00061 class IdeCamera; 00062 class IdeWorld; 00063 class Ide2DCollection; 00064 class IdeRender; 00065 class IdeSurface; 00066 class IdeVertexBuffer; 00067 class IdeRenderTexture; 00068 class IdeRenderMaterial; 00069 class IdeRenderLight; 00070 class IdeSceneLight; 00071 class IdeSurface; 00072 00073 // factory functions 00074 /// initialize the Render system 00075 DERENDER_API deBoolean IdeRender_Initialize(); 00076 /// get a pointer to an IdeRender singleton. 00077 DERENDER_API IdeRender* IdeRender_GetPtr(); 00078 /// destroy the IdeRender singleton 00079 DERENDER_API void IdeRender_Destroy(); 00080 /// release all drivers held by IdeDriver 00081 DERENDER_API void IdeRender_DestroyDriverLinkages(); 00082 00083 typedef IdeRender* (*fIdeRender_GetPtr)(); 00084 typedef void (*fIdeRender_Destroy)(); 00085 typedef void (*fIdeRender_DestroyDriverLinkages)(); 00086 00087 #define DERENDER_MAX_LIGHTS (32) 00088 00089 /// Interface to a high-level rendering API. 00090 /// IdeRender interfaces with the deScene, deDriver, and de2D modules to handle 00091 /// rendering of 3D scenes with 2D composite overlays. 00092 /// Related functions: IdeRender_GetPtr. 00093 //class IdeRender 00094 DE3D_INTERFACE_(IdeRender) 00095 { 00096 protected: 00097 virtual ~IdeRender(void) {} 00098 public: 00099 00100 /// flags for indicating rendering styles 00101 enum RenderFlag_t 00102 { 00103 Render_Dot = 0, ///< render dots (points) 00104 Render_Mesh, ///< render wireframe meshes 00105 Render_Fill, ///< render solid-filled triangles (default value) 00106 Render_FillAndMesh, ///< render solid-filled with wireframe on top 00107 Render_DepthMesh, ///< render only visible wireframe pieces 00108 Render_CullCW, ///< cull faces with clockwise vertex winding (default value) 00109 Render_CullCCW, ///< cull faces with counter-clockwise vertex winding 00110 Render_CullNone, ///< cull no faces according to vertex winding 00111 Render_NoWaterMark, 00112 Render_WaterMark, 00113 Render_WaterMarkFade, 00114 Render_MaxFlag, 00115 Render_Force32 = 0x7FFFFFFF 00116 }; 00117 00118 /// flag for setting render-states in a group 00119 // this is really a hack and should be superceded by the shader system 00120 enum StencilType_t 00121 { 00122 Stencil_Disable = 0,///< No stenciling comparisons or operations 00123 Stencil_DrawOn, ///< render only when stencil value is Ref. Overloads Comparison to EQUAL if ALWAYS is specified 00124 Stencil_SetTo, ///< set rendered pixels to stencil value Ref 00125 Stencil_Invert, ///< invert stencil value on rendered pixels 00126 Stencil_Increment, ///< increment rendered pixels' stencil values, and wrap if X is non-zero 00127 Stencil_Decrement, ///< decrement rendered pixels' stencil values, and wrap if X is non-zero 00128 Stencil_UseColor, ///< not a stencil state, call with boolean value in Ref for color buffer rendering 00129 Stencil_MaxFlag, 00130 Stencil_Force32 = 0x7FFFFFFF 00131 }; 00132 00133 // another hack, this will be superceded by IdeSurface 00134 struct deRenderSurface 00135 { 00136 deBoolean Transparency; 00137 IdeRenderMaterial* Material; 00138 IdeRenderTexture* Texture; 00139 short TexBaseIndex, TexDetailIndex; 00140 short BumpBaseIndex, BumpDetailIndex; 00141 short SpecMapIndex, EmissiveIndex; 00142 // insert shader entries here 00143 void* VProgram; 00144 void* DiffuseShader; 00145 void* TextureShader; 00146 void* SpecShader; 00147 }; 00148 00149 /// a structure used by the scenegraph to have geometry rendered 00150 struct deRenderObject 00151 { 00152 IdeVertexBuffer* VB; 00153 IdeVertexBuffer* IndexOverride; 00154 long IndexOffset; 00155 IdeSurface* pSurface; 00156 deBoolean isSky; 00157 deTransformInfo Transform; 00158 IdeSceneLight* Lights[DERENDER_MAX_LIGHTS]; 00159 // put in info about base texture, bumpmap, specmap, etc 00160 // update: forget that, it's all going into the shader/surface system 00161 deRenderSurface SurfaceDetail; // deprecated by IdeSurface, remove soon 00162 }; 00163 00164 /// Structure keeping statistical information about a rendered frame. 00165 /// This information can be useful for optimizing your application and content. 00166 struct deRenderStats 00167 { 00168 /// information extracted from the driver 00169 IdeDriver::deDriverStats DriverStats; 00170 /// count of how many things were rendered 00171 long VertexRenders, IndexRenders, PrimitiveRenders; 00172 /// count of items regarding vertex buffers 00173 long VBufferRenders, VBufferUpdates, VBufferSubRenders; 00174 /// total number of vertex buffers used (and number that had indexed data) 00175 long VBuffersTotal, VBuffersIndexed; 00176 /// number of textures used 00177 long TexturesTotal; 00178 /// number of texture switches 00179 long TexturesChanged; 00180 /// number of material changes during the frame 00181 long MaterialsChanged; 00182 /// number of bitmaps total and in relation to a vertex buffer 00183 long BitmapsTotal, MinBitmapsPer, MaxBitmapsPer; 00184 /// number of lights per vertex buffer 00185 long MinLightsPer, MaxLightsPer; 00186 /// each index stores the number of vertices rendered with that number of lights. 00187 /// ie, LightsVertNum[3] is the number of vertices rendered with 3 lights affecting them. 00188 long LightsVertNum[9]; 00189 /// the scene may be rendered more than one time to optimize certain things 00190 long RenderPasses, VertexPasses; 00191 /// the frustum far plane distance used for rendering 00192 deFloat FarPlaneDistUsed; 00193 // perhaps a bit of info about # of pixels Cleared 00194 }; 00195 00196 /// set a flag for the next call to Render to use. 00197 /// see IdeRender::RenderFlag_t for notes on usage 00198 virtual deBoolean SetRenderFlag(IdeRender::RenderFlag_t Flag) = 0; 00199 00200 /// Set a pre-defined stencil method. 00201 /// notes on how stenciling works and what it does: 00202 /// <br>(StencilRef & StencilMask) RenderCmpFunc (StencilBufferValue & StencilMask)<br> 00203 /// That is the comparison performed for each pixel drawn when stenciling is enabled. 00204 /// The StencilRef value is compared with the StencilBufferValue, using a comparison function 00205 /// to evaluate success or failure of the test. If the stencil test fails, the operation for 00206 /// STENCILFAIL will be performed. If the stencil test passes and the depth-test fails, the 00207 /// operatation for STENCILZFAIL will be performed. If both the stencil and depth tests pass, 00208 /// the operation for STENCILPASS will be performed. 00209 /// <br>If modifying values in the stencil buffer, the write-mask is applied to the bits being 00210 /// altered. Using the StencilMaks and WriteMask, you can effectively store more than one useful 00211 /// "channel" of stencil information and modify it. However, there is usually a maximum of 8 bits 00212 /// available for use in stenciling, so not too much detail can be stored if the stencil channel 00213 /// is being "shared" in such a way. For Destiny3D, the aim is to perform stenciled lighting 00214 /// and stenciled portaling on the same geometry by sharing out the stencil buffer in this 00215 /// manner. 00216 /// @param pDriver valid render-capable driver 00217 /// @param Stencil any valid value of StencilType_t 00218 /// @param Ref the StencilRef value 00219 /// @param X a special-use flag argument, used with some stencil types to specify behavior 00220 /// @param Comparison a comparison function for comparing current stencil value to reference value. 00221 /// see IdeDriver documentation for notes on how stenciling works 00222 /// @param StencilTest the test for which the operation will be performed. Default is STENCILPASS, 00223 /// can also be STENCILFAIL or STENCILZFAIL 00224 /// @param StencilMask the stenciling read-mask 00225 /// @param WriteMask the stenciling write-mask 00226 virtual deBoolean SetStencilState( IdeDriver * pDriver, StencilType_t Stencil, DWORD Ref, DWORD X, 00227 IdeDriver::RenderCmpFunc Comparison = IdeDriver::COMPARE_ALWAYS, 00228 IdeDriver::RenderState StencilTest = IdeDriver::RENDER_STENCILPASS, 00229 DWORD StencilMask = 0xff, DWORD WriteMask = 0xff) = 0; 00230 00231 /// Render a scene from a given vantage point, possibly doing some cleanup work with optional params 00232 /// @param cam a camera containing details of how to render the scene 00233 /// @param DeltaTime time elapsed since the last call to Render 00234 /// @param UseSG set to true if the scenegraph is to be traversed 00235 /// @param ClearColorBuffer (optional, default false) if true, the color buffer will be cleared to the stored BGColor 00236 /// @param BeginFrame (optional, default false) will call BeginFrame(...) for you 00237 /// @param EndFrame (optional, default false) will call EndFrame(...) for you 00238 virtual deBoolean Render(IdeCamera * cam, deDouble DeltaTime, deBoolean UseSG = deTRUE, deBoolean ClearColorBuffer = DE_FALSE, deBoolean BeginFrame = DE_FALSE, deBoolean EndFrame = DE_FALSE) = 0; 00239 /// Just like Render() except instead of rendering to the screen, it renders to a texture. 00240 /// the texture to be used is handled through the Target parameter, and the texture on the video 00241 /// hardware after the render will not match the bitmap in system memory. BeginFrame should 00242 /// still be called before this method, so that statistics are properly handled. The camera's 00243 /// viewport will be used when rendering to the texture, so the camera viewport must be the 00244 /// correct size for the texture being rendered into. However, the aspect ratio of the camera can 00245 /// be locked to something other than width/height so that the texture can be mapped in a 00246 /// way that doesn't require it to be viewed as square. 00247 /// @param Target The bitmap which acts as the handle to the texture to be rendered into. 00248 /// This bitmap must have been added to the driver after having been set to 00249 /// have render-target capability. 00250 virtual deBoolean RenderTexture(IdeBitmap * Target, IdeCamera * cam, deDouble DeltaTime) = 0; 00251 /// begin a frame before rendering geometry. 00252 /// @param WindowHandle the window with an attached driver to be used 00253 /// @param ClearColorBuffer (optional, default true) if true, the color buffer will be cleared to the stored BGColor 00254 virtual deBoolean BeginFrame(HWND WindowHandle, deBoolean ClearColorBuffer = DE_TRUE) = 0; 00255 /// end a frame and present the back-buffer to the screen 00256 /// @param WindowHandle the window with an attached driver to be used 00257 /// @param DeltaTime time elapsed since the last call to EndFrame 00258 virtual deBoolean EndFrame(HWND WindowHandle, deDouble DeltaTime) = 0; 00259 00260 // for use by scenegraph only 00261 virtual IdeDriver * CurrentPassDriver() = 0; 00262 virtual void RenderPrepBuffer(deRenderObject & obj) = 0; 00263 virtual void RenderPrepBatch(long Level, IdePortal * Portal, deRect & Viewport, deTransformInfo * PortalPos, deTransformInfo * Concat) = 0; 00264 virtual deDouble GetTimeStep() = 0; 00265 00266 /// set the relative path that contains Destiny3D driver files (defaults to "." which is current directory) 00267 virtual void SetDriverPath(const char * RelativePath) = 0; 00268 /// returns a pointer to internally-held IdeDriverLoad interface 00269 virtual IdeDriverLoad* GetDriverLoad() = 0; 00270 /// attach a driver to the specified window. The driver will not be ready for rendering 00271 /// @return a valid IdeDriver pointer if success, NULL if failure 00272 /// @param hWnd a valid window handle to attach a driver to 00273 /// @param DriverName (optional, defualt = "Direct3D8") string containing the name of driver to use 00274 virtual IdeDriver * AttachToWindow(HWND hWnd, char * DriverName = "Direct3D8") = 0; 00275 /// detach and destroy a driver attached to the specified window 00276 virtual deBoolean DetachFromWindow(HWND hWnd) = 0; 00277 /// update the driver's knowledge of the window's client rect, ie after a WM_SIZE message is received 00278 virtual void UpdateWindow(HWND hWnd) = 0; 00279 virtual void UpdateDisplay() = 0; 00280 00281 /// load a driver up and prepare it for rendering 00282 /// @return true if successful, false if failure to use specified format 00283 /// @param hWnd a valid window handle to attach a driver to 00284 /// @param Display user-filled driver settings to be used in initializing the driver. 00285 /// @param DriverName (optional, defualt = "Direct3D") string containing the name of driver to use 00286 virtual deBoolean LoadDriver(HWND hWnd, IdeDriver::deDisplay * Display, char * DriverName = "Direct3D8") = 0; 00287 /// check a driver-enumerated resolution 00288 /// @return false if pDriver is NULL or if Adapter or EntryNum are outside valid ranges, true otherwise 00289 /// @param Width pointer to integer to store width of entry into 00290 /// @param Height pointer to integer to store height of entry into 00291 /// @param RefreshRate pointer to integer to store screen refresh rate (in hertz) of entry into 00292 virtual deBoolean GetResolution(IdeDriver * pDriver, long Adapter, long EntryNum, long * Width, long * Height, long * RefreshRate) = 0; 00293 /// a rather high-level method of finding a format close to what you want for z-buffer. 00294 /// @pre Adapter, Bpp, and Windowed variables in Display set to appropriate values. 00295 /// ZDepth and StencilDepth values in Display set to minimum acceptable bit-depth values. 00296 /// @post Display contains a valid combination of values to call LoadDriver() with. 00297 /// The user should check the values of ZDepth, StencilDepth, and Zpp upon failure, 00298 /// so that he can adjust game settings to what is possible. 00299 /// @return true if a format was found that satisfies criteria set, false if criteria could not be met. 00300 /// @param pDriver pointer to a valid IdeDriver interface 00301 /// @param Display pointer to a IdeDriver::deDisplay structure meeting the pre-requisites 00302 /// @param PreferStencil upon failure to find a good format, satisfy stencil buffer needs before depth-buffer needs (if true) 00303 virtual deBoolean QueryFormat(IdeDriver * pDriver, IdeDriver::deDisplay * Display, deBoolean PreferStencil = deFALSE) = 0; 00304 00305 /// set the color that the color-buffer will be cleared to. 00306 /// ie, 0x00102030 will set the color to 16 red intensity, 32 green intensity, and 48 blue intensity 00307 /// out of a maximum intensity of 255 00308 virtual void SetBGColor(deARGB color) = 0; 00309 /// set the maximum depth of T-portal progression. 00310 /// Each T-Portal clears a portion of the screen as part of the rendering process, 00311 /// so using a high number can adversely affect your framerate. Default value = 8. 00312 virtual void SetMaxTPortalDepth(long MaxDepth = 8) = 0; 00313 virtual void SetMaxLights(long MaxHWLights = 32, long MaxTexLights = 4) = 0; 00314 /// clear the entire color-buffer to a specified color, possibly also clearing the Z-buffer 00315 virtual deBoolean ClearBackground(HWND hWnd, deARGB color = 0x00000000, deBoolean ClearZ = DE_TRUE) = 0; 00316 /// enable or disable texturing on all geometry rendered through this interface 00317 virtual void EnableTexturing(deBoolean Enabled) = 0; 00318 00319 /// Specify a user-handled 2D collection for a driver attached to specified window to use. 00320 /// This method invokes Collection->Claim(), and then Release() on its currently held collection. 00321 virtual deBoolean Use2DCollection(HWND hWnd, Ide2DCollection * Collection) = 0; 00322 /// Get the 2D collection that is being used by the driver attached to specified window. 00323 /// This method does NOT invoke Claim() on the returned collection, but user code may do so. 00324 virtual Ide2DCollection * Get2DCollection(HWND hWnd) = 0; 00325 00326 /// call before BeginFrame with a user-handled instance of the structure to be filled 00327 /// with information. the data will be valid after a call to Render() or EndFrame() 00328 virtual void SetStatStruct(deRenderStats * StatStruct) = 0; 00329 00330 virtual deBoolean Screenshot(HWND hWnd, const char* filename, long ScreenSizes = 1) = 0; 00331 00332 /// get the current frame ID number. 00333 /// clamped to [0 <-> 2^31-1] 00334 virtual long GetFrameNum() = 0; 00335 }; 00336 00337 #endif
1.3-rc3